package com.beidu.lottery.call.service.portal;

import com.beidu.lottery.call.entity.PortalActivityRule;
import com.beidu.lottery.call.entity.dto.ActivityLotteryDTO;
import com.beidu.lottery.call.entity.dto.OrderBaseDTO;
import com.beidu.lottery.call.entity.query.ActivityAwardRecordsQuery;
import com.beidu.lottery.call.entity.vo.ActivityLotteryResultVO;
import com.beidu.lottery.call.entity.vo.UserAwardRecordDetailVO;
import com.beidu.lottery.call.entity.vo.UserAwardRecordVO;
import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * <p>
 * 抽奖活动 服务类
 * </p>
 *
 * @author 北渡
 * @since 2023-11-16
 */
public interface ActivityLotteryService {

    /**
     * 抽奖数据预提交（Producer）
     *
     * @param id   活动ID
     * @param rule 活动规则
     * @author 北渡
     */
    ActivityLotteryResultVO drawPreSubmit(Integer id, PortalActivityRule rule);

    /**
     * 抽奖数据预提交责任链模式（Producer）
     *
     * @param id   活动ID
     * @author 北渡
     */
    ActivityLotteryResultVO drawPreSubmit(Integer id);

    /**
     * 抽奖数据保存（Consumer）
     *
     * @param lotteryDTO 抽奖数据
     * @param rule       活动规则
     * @author 北渡
     */
    void drawSubmit(ActivityLotteryDTO lotteryDTO, PortalActivityRule rule);

    /**
     * 随机分页查询中奖名单（字符串）
     * <p>
     * 页码数量算法：假设pageSize=10, total=21, 页码数返回2(最大化满足分页数量), total小于分页数量返回1
     * 随机分页算法：total/pageSize做为随机界限值
     *
     * @return 字符串格式：恭喜 {用户昵称} 获得了 {奖品名称}
     * @author 北渡
     */
    List<String> pageAwardRecords(ActivityAwardRecordsQuery param);

    /**
     * 分页查询用户中奖记录
     * <p>
     * SQL中手动分页, 不进行count总数, 优化查询速度
     *
     * @author 北渡
     */
    PageInfo<UserAwardRecordVO> pageUserRecords(ActivityAwardRecordsQuery param);

    /**
     * 查询用户中奖记录详情
     *
     * @param orderNo 订单编号
     * @author 北渡
     */
    UserAwardRecordDetailVO userRecordDetail(String orderNo);

    /**
     * 提交领奖信息
     *
     * @return true:成功, false:失败
     * @author 北渡
     */
    boolean submitConsigneeInfo(OrderBaseDTO orderBaseDTO);

}
